home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 21 / CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso / CUCD / Programming / Python-1.4 / Source / Amiga / Python_netlib / serveraccept.c < prev    next >
C/C++ Source or Header  |  1998-01-31  |  4KB  |  144 lines

  1. RCS_ID_C="$Id: serveraccept.c,v 4.2 1994/09/30 00:35:04 jraja Exp $";
  2. /*
  3.  *      serveraccept - accept a server connection on named port
  4.  *
  5.  *      Copyright © 1994 AmiTCP/IP Group, 
  6.  *                       Network Solutions Development Inc.
  7.  *                       All rights reserved.
  8.  */
  9.  
  10. /****** net.lib/serveraccept ***********************************************
  11.  
  12.     NAME
  13.         serveraccept - Accept a server connection on named port
  14.  
  15.     SYNOPSIS
  16.         socket = serveraccept(name, peer);
  17.  
  18.         long serveraccept(char *, struct sockaddr_in *);
  19.  
  20.     DESCRIPTION
  21.         The serveraccept() library call binds a socket to the named Internet
  22.         TCP port. Then it listens the socket and accepts the connection to
  23.         the port. The peer's socket address is returned in sockaddr pointed
  24.         by sockaddr argument.
  25.  
  26.         The port name is resolved by getservbyname() call. A numeric value
  27.         for port name is also accepted.
  28.   
  29.         This module is meant for daemon developing.
  30.  
  31.     INPUTS
  32.         name   - port name or numeric string.
  33.         peer   - pointer to struct sockaddr_in
  34.  
  35.     RESULT
  36.         socket - positive socket id for success or -1 for failure.
  37.  
  38.         peer   - sockaddr_in structure containing peer's internet address.
  39.                  Note that on error, the structure containing peer address
  40.                  is not necessarily updated.
  41.  
  42.     SEE ALSO
  43.         bsdsocket/accept, bsdsocket/getservbyname
  44.  
  45. *****************************************************************************
  46. *
  47. */
  48.  
  49. #ifdef _AMIGA
  50. #if __SASC
  51. #include <proto/socket.h>
  52. #include <proto/dos.h>
  53. #include <proto/exec.h>
  54. #include <clib/netlib_protos.h>
  55. #include <pragmas/exec_sysbase_pragmas.h>
  56. #elif __GNUC__
  57. #include <inline/socket.h>
  58. #include <inline/exec.h>
  59. #else
  60. #include <clib/socket_protos.h>
  61. #include <clib/netlib_protos.h>
  62. #endif
  63. #endif /* _AMIGA */
  64.  
  65. #include <errno.h>
  66. #include <netdb.h>
  67.  
  68. #include <sys/param.h>
  69. #include <sys/socket.h>
  70. #include <sys/ioctl.h>
  71. #include <netinet/in.h>
  72.  
  73. #include <signal.h>
  74.  
  75. #include <dos/dos.h>
  76. #include <exec/execbase.h>
  77. #include <dos/var.h>
  78.  
  79. #include <stdlib.h>
  80.  
  81. /*
  82.  * serveraccept:
  83.  *      Accept a server socket from the named port
  84.  */
  85. long
  86. serveraccept(char *pname, struct sockaddr_in *ha)
  87. {
  88.   struct sockaddr_in sin; 
  89.   long ha_len = sizeof(*ha);
  90.   int s, sa;
  91.   long port;
  92.   struct servent *sp;
  93.   long on = 1;
  94.  
  95.   /* Create address corresponding our service */
  96.   bzero((caddr_t)&sin, sizeof(sin));
  97. #ifdef BSD4_4
  98.   sin.sin_len = sizeof(struct sockaddr_in);
  99. #endif
  100.   sin.sin_family = AF_INET;
  101.  
  102.   /* A port must be in the range 1 - 65535 */
  103.   if (StrToLong(pname, &port) > 0 && port < 65536 )
  104.     sin.sin_port = port;
  105.   else if (sp = getservbyname(pname, "tcp"))
  106.     sin.sin_port = sp->s_port;
  107.   else {
  108.     return -1;
  109.   }
  110.  
  111.   sin.sin_addr.s_addr = INADDR_ANY;
  112.  
  113.   if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  114.     PrintNetFault(Errno(), "socket");
  115.     return -1;
  116.   }
  117.  
  118.   /* Reuse this port */
  119.   if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) {
  120.     PrintNetFault(Errno(), "setsockopt");
  121.     sa = -1; goto Return;
  122.   }
  123.  
  124.   /* Bind it to socket */
  125.   if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0 ) {
  126.     PrintNetFault(Errno(), "bind");
  127.     sa = -1; goto Return;
  128.   }
  129.  
  130.   if (listen(s, 1) < 0) {
  131.     PrintNetFault(Errno(), "listen");
  132.     sa = -1; goto Return;
  133.   }
  134.  
  135.   if ((sa = accept(s, (struct sockaddr *)ha, &ha_len)) < 0){
  136.     PrintNetFault(Errno(), "accept");
  137.   }
  138.  
  139.  Return:
  140.   CloseSocket(s);
  141.   return sa;
  142. }
  143.  
  144.